package com.cskaoyan.javase.oop1._12static._3usecase;

/**
 * static关键字有什么具体的使用场景呢？
 * 这里
 * 根据static关键字的一些特点来明确它的使用场景
 * 给大家以后使用static关键字做一下参考。
 *
 * 静态成员变量：
 *      1.属于全体对象所共享而不是独属于某个对象的成员变量
 *      所以当存在需要所有对象共享的变量时，应该使用static修饰的静态成员变量。
 *
 *      2.在整个类全局独一份的(所以静态成员变量也有人叫"全局变量")（因为类加载只有一次）
 *      所以，如果希望某个变量在类的全局独一份时，应该使用static修饰的静态成员变量。
 *
 *      当然,实际开发中往往是两条都会使用.
 *
 * 静态成员方法：
 * 静态方法的最主要特点就是调用简单，无需创建对象即可调用。
 * 所以如果希望一个方法能够更方便快捷的去调用，可以把它声明为static修饰的静态成员方法。
 *
 * 根据静态成员方法调用简单的特点，当一个类中全部都是静态成员方法时，
 * 类中的所有方法的调用都可以使用类名点去完成，这就是Java当中的"工具类"。
 * 比较典型的有：数组工具类Arrays、集合工具类Collections、数学工具类Math,对象工具类Objects等等。
 *
 * 最后，还可以使用静态成员方法给静态成员变量赋值。
 * 但是一定要注意，静态成员方法不调用不执行，要想依赖静态方法完全赋值，必须主动调用该方法。
 *
 * @since 11:05
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Student s = new Student();
            System.out.println("创建了第" + (i + 1) + "位童鞋的对象,学号是" + s.stuId);
        }
        System.out.println(Student.count);

        Demo d = new Demo();
        d.test();

        Demo.testStatic();
    }

    public void test() {
    }

    public static void testStatic() {
    }
}

class Student {
    int stuId;
    /*
        需求1:
        我希望能够统计在外界new创建Student类对象的次数

        首先既然要统计次数,需要计数器,需要一个变量统计次数
        这个变量一定是一个静态成员变量,在整个类的全局独一份

        并且构造器调用一次,就创建了一个对象
        所以count++写在构造器中 即可!
     */
    static int count = 0;
    static int initId = 1001;

    public Student() {
        init();
    }

    public void init() {
        count++;
        /*stuId = initId;
        initId++;*/
        // 以上二合一
        stuId = initId++;
    }

    /*
        需求2:
        假设每位童鞋,都有一个属性 学号
        每位同学的学号都是自动生成的
        生成的规则是:
            1.初始创建的第一个学生对象的学号是1001
            2.第二位童鞋就是1002
            3.第三位童鞋就是1003,每次加1
            3.以此类推

        为了实现这个需求,就需要一个变量来存储当前创建的学生对象的学号应该是多少
        那么这个变量是什么变量呢?
        应该是一个静态成员变量,因为我们不希望它受创建对象的影响,而且也应该是全局唯一的变量
     */
}